約 5,088,485 件
https://w.atwiki.jp/chapati4it/pages/84.html
お知らせ JLayerを直接使うより、JLayerと同じJavaZoomで公開されているBasicPlayerを使ったほうが簡単です。 BasicPlayerを使ったサンプルはこちら MP3プレイヤーサンプル(JLayer,BasicPlayer) サンプルダウンロード 実行形式 JLayerSample.zip ソース&JLayer JLayerSampleSrc.zip ソース import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.datatransfer.DataFlavor; import java.awt.dnd.DnDConstants; import java.awt.dnd.DropTarget; import java.awt.dnd.DropTargetAdapter; import java.awt.dnd.DropTargetDropEvent; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.List; import java.util.Vector; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JSeparator; import javax.swing.SwingWorker; import javazoom.jl.decoder.Bitstream; import javazoom.jl.decoder.BitstreamException; import javazoom.jl.decoder.Decoder; import javazoom.jl.decoder.Header; import javazoom.jl.decoder.JavaLayerException; import javazoom.jl.decoder.SampleBuffer; import javazoom.jl.player.AudioDevice; import javazoom.jl.player.FactoryRegistry; // JMF MP3 Plugin // http //www.oracle.com/technetwork/java/javase/download-137625.html public class JLayerSample extends JFrame { // 再生モード 停止 static final int PLAY_MODE_STOP = 0; // 再生モード 一時停止 static final int PLAY_MODE_PAUSE = 1; // 再生モード 再生 static final int PLAY_MODE_PLAY = 2; // 再生用の変数 // ファイル名 String filename; // バッファのバッファ Vector BufferModel buffer; // デコードスイングワーカー DecodeWorker decodeWorker; // 再生スイングワーカー PlayWorker playWorker; // デバイス AudioDevice dev; // デコーダ Decoder decoder; // 再生モード int playMode = 0; // Swing用変数、定数 // ボタン用テキスト 停止 final static String STOP = "Stop"; // ボタン用テキスト 再生 final static String PLAY = "Play"; // ボタン用テキスト 一時停止 final static String PAUSE = "Pause"; // タイトル final static String TITLE = "JLayerでmp3再生"; final static String FILE_NAME = "ファイル名:"; // 再生ボタン JButton bPlay; // 曲名ラベル JLabel label; // バッファモデル class BufferModel { // コンストラクタ SampleBufferからバッファとバッファの長さを取得しメンバに保存します。 public BufferModel(SampleBuffer output) { // 上書きされるのでクローンします。 buffer = output.getBuffer().clone(); length = output.getBufferLength(); } // バッファ public short[] buffer; // バッファの長さ public int length; } public static void main(String[] args) { new JLayerSample(); } // コンストラクタ public JLayerSample() { setTitle(TITLE); setDefaultCloseOperation(EXIT_ON_CLOSE); setBounds(200, 100, 300, 100); setLayout(new FlowLayout()); // ドロップターゲット設定 new DropTarget(this, DnDConstants.ACTION_COPY, new MyDropTargetListener()); // バッファのバッファ buffer = new Vector BufferModel (); // デコードスレッド開始 decodeWorker = new DecodeWorker(); decodeWorker.execute(); // 再生スレッド開始 playWorker = new PlayWorker(); playWorker.execute(); // ラベル設置 label = new JLabel(" mp3ファイルをドロップしてください。"); label.setPreferredSize(new Dimension(getWidth() - 10, 20)); add(label); add(getHr(2000, 0)); // 再生、停止ボタン設置 bPlay = new JButton(PLAY); bPlay.addActionListener(new bPlayAction()); JButton bStop = new JButton(STOP); bStop.addActionListener(new bStopAction()); add(bPlay); add(bStop); setVisible(true); addComponentListener(new ComponentAdapter() { // ウィンドウサイズが変化したらラベルのサイズ変更 @Override public void componentResized(ComponentEvent e) { label.setPreferredSize(new Dimension(getWidth() - 10, 20)); } }); } // 水平線 public JSeparator getHr(int width, int hight) { JSeparator sp = new JSeparator(JSeparator.HORIZONTAL); sp.setPreferredSize(new Dimension(width, hight)); return sp; } // 再生ボタンのアクションクラス class bPlayAction implements ActionListener { @Override public void actionPerformed(ActionEvent e) { // System.out.println("mode = " + playMode); if (playMode == PLAY_MODE_PAUSE) { // 一時停止の場合、一時停止を解除します noPause(); } else if (playMode == PLAY_MODE_STOP) { // 停止中の場合、再生開始します play(); } else if (playMode == PLAY_MODE_PLAY) { // 再生中の場合、一時停止します pause(); } } } // 停止ボタンのアクションクラス class bStopAction implements ActionListener { @Override public void actionPerformed(ActionEvent e) { stop(); } } // 一時停止 private void pause() { playMode = PLAY_MODE_PAUSE; bPlay.setText(PLAY); } // 一時停止解除 private void noPause() { playMode = PLAY_MODE_PLAY; bPlay.setText(PLAY); } // 再生 private void play() { decodeWorker.decodePause(); decodeWorker.decodeInit(); playMode = PLAY_MODE_PLAY; bPlay.setText(PAUSE); } // 停止 private void stop() { playMode = PLAY_MODE_STOP; bPlay.setText(PLAY); } // デコードワーカースレッド // デコーダクラスを腹持ちして、デコードループを呼び出し // デコーダクラスのポーズと初期化を中継します class DecodeWorker extends SwingWorker Object, Object { public MyDecoder myDecoder = new MyDecoder(); // デコードループを呼び出します @Override protected Object doInBackground() throws Exception { myDecoder.decodeRoop(); return null; } // デコーダクラスのポーズを呼び出します public void decodePause() { myDecoder.pause(); } // デコーダクラスの初期化を呼び出します public void decodeInit() { myDecoder.init(); } } // デコーダークラス class MyDecoder { private Bitstream bitstream; public InputStream stream; // デコードフラグ boolean decodeFlg = false; // デコードを停止 public void pause() { decodeFlg = false; } // デコーダーを初期化します void init() { // System.out.println("decodeInit start"); try { // デコード停止 decodeFlg = false; // バッファクリア buffer.clear(); // ストリームクローズ closeStream(); // デコーダの初期化 openDevice(); // インプットストリーム取得 stream = getInputStream(); if (stream == null) { return; } bitstream = new Bitstream(stream); // デコード再開 decodeFlg = true; } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } // System.out.println("decodeInit end"); } // デバイスを取得 private void openDevice() throws JavaLayerException { try { if (dev != null) { // デバイスがnullでなければ、クローズする dev.flush(); dev.close(); } // デバイスを取得 dev = getAudioDevice(); } catch (JavaLayerException e) { // デバイスを取得できない場合エラー e.printStackTrace(); JOptionPane.showMessageDialog(null, "デバイスを取得できませんでした。" + e.getMessage(), TITLE + " エラー", JOptionPane.WARNING_MESSAGE); System.exit(1); } // デコーダーを生成して開くする decoder = new Decoder(); dev.open(decoder); } // デコードループ // エラーが起きてもぐるぐる回り続けデコードします // デコードフラグがtrue、再生モードが停止、バッファのサイズが100以上のいずれかの場合 // デコードしないでループを空回しします void decodeRoop() { decodeFlg = true; // int i = 0; while (true) { try { if (decodeFlg playMode != PLAY_MODE_STOP buffer.size() 100) { if (!decordOneFrame()) { // System.out.println("なにかエラー?"); } } // デバッグ用のログ出力 // i++; // if (i % 1000 == 0) { // System.out.println("i = " + i + ", buffer.size = " + // buffer.size()); // } Thread.sleep(1); } catch (Exception e) { e.printStackTrace(); // エラーを握りつぶす } } } // ストリームクローズ void closeStream() { try { if (bitstream != null) { // クローズする bitstream.close(); bitstream = null; } } catch (BitstreamException e) { // 例外は握りつぶす } } // インプットストリームを取得 protected InputStream getInputStream() throws IOException { if (filename == null) { return null; } // System.out.println(filename); FileInputStream fin = new FileInputStream(filename); BufferedInputStream bin = new BufferedInputStream(fin); return bin; } // 1フレームデコード private boolean decordOneFrame() { if (bitstream == null) { return false; } try { Header h = bitstream.readFrame(); if (h == null) { return false; } SampleBuffer output = (SampleBuffer) decoder.decodeFrame(h, bitstream); if (output.getBufferLength() == 0) { // System.out.println("bufferSize = " // + output.getBufferLength()); return false; } buffer.add(new BufferModel(output)); bitstream.closeFrame(); } catch (JavaLayerException ex) { return false; } return true; } } // 再生用スイングワーカー // 再生クラスを腹持ちして、再生ループを呼び出します class PlayWorker extends SwingWorker Object, Object { MyPlayer player = new MyPlayer(); // 再生ループを呼び出します @Override protected Object doInBackground() throws Exception { // System.out.println("PlayWorker#doInBackground start"); player.playRoop(); // System.out.println("PlayWorker#doInBackground end"); return null; } } // デバイスの取得 protected AudioDevice getAudioDevice() throws JavaLayerException { return FactoryRegistry.systemRegistry().createAudioDevice(); } // 再生クラス // 再生ループしかないですけど class MyPlayer { // 再生ループ // エラーが起きようが何しようがずっと回り続け、バッファの中身をデバイスに出力します // 再生モードが再生以外、バッファサイズが0の場合は再生しないで次のループに回します public void playRoop() { // System.out.println("playRoop start"); // int j = 0; while (true) { try { // j++; // if (j % 1000 == 0) { // System.out.println("j = " + j); // } if (playMode != PLAY_MODE_PLAY || buffer.size() == 0) { Thread.sleep(1); continue; } // バッファの中身を取得し、デバイスに書き込みます BufferModel model = buffer.remove(0); dev.write(model.buffer, 0, model.length); Thread.sleep(1); } catch (Exception e) { e.printStackTrace(); } } } } // ドロップターゲットリスナー // ドロップされたファイルを受け取り、最初のファイルだけを再生します class MyDropTargetListener extends DropTargetAdapter { @Override public void drop(DropTargetDropEvent dtde) { dtde.acceptDrop(DnDConstants.ACTION_COPY); boolean b = false; try { if (dtde.getTransferable().isDataFlavorSupported( DataFlavor.javaFileListFlavor)) { b = true; List File list = (List File ) dtde.getTransferable() .getTransferData(DataFlavor.javaFileListFlavor); for (File file list) { // 最初のファイルだけ取得 filename = file.getPath(); label.setText(FILE_NAME + file.getName()); // 取得したファイルを再生する stop(); play(); break; } } } catch (Exception e) { e.printStackTrace(); } finally { dtde.dropComplete(b); } } } } 解説 Javaでmp3を再生するには、Java Media Framework APIという追加のAPIが提供されています。 ですが、Java Media Framework APIは配布に難がありそうなので、JLayerというmp3を再生出来るライブラリを使ってみました。 JLayerに標準で付属の再生メソッドは、再生はできるものの、停止や一時停止はできず、 単純にメソッドを呼ぶだけだと再生終了までウィンドウが操作できなくなります。 停止や一時停止など、細かいことをする場合は、自分でデコードと再生を行うとよいようです。 サンプルの解説 ウィンドウにmp3ファイルをドロップすると再生開始します。 停止、一時停止、再生ボタンもなんとか操作できます。 デコードと再生はそれぞれ、デコードスレッド、再生スレッドを作成し独立して行います。 デコードスレッドはデコード結果をバッファに詰め込み、 再生スレッドはバッファからデコード結果を取得して再生します。 バッファに余裕を持ってデコード結果を貯めて置けるので、標準の再生メソッドよりは音の途切れが少ないかもしれません。 コメント 名前
https://w.atwiki.jp/asion/pages/57.html
マテリアル・巨獣攻略 巨獣はコアが弱点(装甲で隠されていることもある) 巨獣との距離が近いほど与えるダメージが上がる ギガント系 「隻腕の巨獣ギガント」 「究極のギガント」 「異界のギガント」 「豪腕の巨獣グラティオン」 「究極のグラティオン」 「古の大魔神ゴライアス」 フェンリル系 「銀狼の巨獣フェンリル」 「究極のフェンリル」 「異界のフェンリル」 「闇夜の狼ヴァナルガンド」 「究極のヴァナルガンド」 「電撃の古狼ブラックファング」 イフリート系 「灼熱の巨獣イフリート」 「究極のイフリート」 「異界のイフリート」 「煙霧の悪魔ベルゼブブ」 「究極のベルゼブブ」 「不滅の魔獣デス・イフリート」 ギルガメッシュ系 「凶刃の巨獣ギルガメッシュ」 「究極のギルガメッシュ」 「異界のギルガメッシュ」 「背徳の戦獣ドゥルガー」 「究極のドゥルガー」 「無限の超獣ギルガメッシュΩ」 シヴァ系 「氷雪の女王シヴァ」 「究極のシヴァ」 「異界のシヴァ」 「神秘の化身シヴァ・カーリー」 バハムート系 「巨獣神バハムート」 「究極のバハムート」 「シン=バハムート」 「カオス=バハムート」 このページのトップに戻る
https://w.atwiki.jp/appleseedtactics/pages/47.html
リクレメイションカード リデザインカード リプロダクションカード 強化服1 耐湿服 耐乾服 活性液1 耐熱液 耐寒液 保護ワックス1 耐湿材 耐乾材 視覚補強プラント1 高感度視覚1 サーモセンサー1 平衡感覚強化薬1 スタビライズボーン1 特殊軽金属1 反射神経強化薬1 生体反応強化剤1 高性能エンジン1 カーニバルゲノム1 パッションゲノム1 ファナティシズムゲノム1 マリスゲノム1 ライオットゲノム1 バッシュシステム1 ラッシュシステム1 スマッシュシステム1 スラッシュシステム1 クラッシュシステム1 プログラム・フェレット1 プログラム・ハウンド1 プログラム・バジャー1 プログラム・ワスプ1 プログラム・ヘッジホッグ1 カーニバルゲノム1 パッションゲノム1 ファナティシズムゲノム1 マリスゲノム1 ライオットゲノム1 バッシュシステム1 ラッシュシステム1 スマッシュシステム1 スラッシュシステム1 クラッシュシステム1 プログラム・フェレット1 プログラム・ハウンド1 プログラム・バジャー1 プログラム・ワスプ1 プログラム・ヘッジホッグ1
https://w.atwiki.jp/wesnoth-wml/pages/95.html
#5,6に力の薬 5Gのみがある道具屋を配置するサンプルコード {PLACE_IMAGE "scenery/tent-shop-weapons.png" 5 6} [set_menu_item] id="example_shop1" description="道具屋に入る" [show_if] [variable] name=x1 numerical_equals=5 [/variable] [variable] name=y1 numerical_equals=6 [/variable] [have_unit] x,y=5,6 side=$side_number [/have_unit] [/show_if] [command] [store_gold] side=$side_number variable=temp_gold [/store_gold] [message] image="scenery/tent-shop-weapons.png" caption="道具屋" message="" [option] message={MENU_IMG_TXT2 "items/potion-red.png" "力の薬" ("格闘威力 +1" " @ 5G")} [command] [if] [variable] name=temp_gold greater_than_equal_to=5 [/variable] [then] [object] name="力の薬" description="格闘威力 +1" cannot_use_message=NONE image="items/potion-red.png" duration=forever silent=no [filter] x,y=$x1,$y1 [/filter] [effect] apply_to=attack range=melee increase_damage=1 [/effect] [/object] [gold] side=$side_number amount=-5 [/gold] [/then] [else] [message] speaker=narrator message="お金が足りません" [/message] [/else] [/if] [/command] [/option] [option] message=_"やめる" [/option] [/message] [/command] [/set_menu_item]
https://w.atwiki.jp/javadsge/pages/6556.html
package de2; import epub.epub; public class pro { public int number; public String[] subtitle=new String[250]; public String[][] paper=new String[200][5000]; public String[] subx=new String[5000]; public String title,author; public int[] subnumber=new int[200]; public static void main(String[] args) { pro test=new pro(); } pro(){ number=2; subtitle[2]="a1"; subtitle[1]=""; subnumber[1]=1; paper[1][1]=" svg xmlns=\"http //www.w3.org/2000/svg\" version=\"1.1\" xmlns xlink=\"http //www.w3.org/1999/xlink\" width=\"100%\" height=\"100%\" viewBox=\"0 0 500 500\" circle cx=\"200\" cy=\"200\" r=\"150\" fill=\"blue\" / /svg "; subnumber[2]=1; paper[2][1]="かわいい2"; title="ttttt"; author="aaaaa"; epub sub=new epub(); sub.number=number; sub.subtitle=subtitle; sub.paper=paper; sub.subnumber=subnumber; sub.title=title; sub.author=author; sub.makedata("svg_333.kepub.epub"); } }
https://w.atwiki.jp/larklein/pages/32.html
Witchスレなどに出たキャラたちです。キャラメイクの参考などにしてください。 現在、ダークエルフが人気のようです。 ウェアウルフ はち(犬歯)/ミー(剣士さん) ダークエルフ ヘリオトロープ(女性・魔剣士)/ラウ(低血圧(陰陽師))/アズミ(黒巫女(魔女)) ルノワ(首狩り族(夜騎士)) オーク ウォール(分厚い面の皮) 人間 ライナス(男性・超人(スタイラー)) 龍人 ネツァク(聖騎士(魔法戦士)) 管理人作 セミキャッツ ラーク(魔法剣士)/フレイア・レイミィ・エレミー(魔法術士) 三色対応型 魔法術士型@炎or氷or雷 育成済サンプル: クロス スレイヤー クロス・スレイヤーは高レベルキャラになっています NPCでもあるのでシナリオ中に必要ならどうぞ メニュー
https://w.atwiki.jp/chapati4it/pages/71.html
JListを表示するだけのサンプル C \のファイル一覧をJListで表示するサンプルです。 JListの使用手順 表示データ作成 表示データをリストモデルに設定 JListを使う場合、通常リストモデルにデータを設定して、それをJListに与えます。 リストモデルを使ってJListを作成 JFrameやJPanelに追加 JListのデータが増えると表示しきれなくなるため、スクロールペインを使ってスクロールできるようにします。 ソース ダウンロード- JListSample.java import java.awt.ScrollPane; import java.io.File; import javax.swing.DefaultListModel; import javax.swing.JFrame; import javax.swing.JList; /* * JListを表示するだけのサンプル * C \のファイル一覧をJListで表示する */ public class JListSample extends JFrame { JList list; DefaultListModel model; public JListSample(String title) { super(title); init(); setDefaultCloseOperation(EXIT_ON_CLOSE); setBounds(100, 100, 300, 200); setVisible(true); } private void init() { // 表示データ作成 File dir = new File("C \\"); File[] childs = dir.listFiles(); // リストモデルを生成 model = new DefaultListModel(); // 表示データをリストモデルに設定 for (File file childs) { model.addElement(file); } // リストモデルを使ってJListを作成 list = new JList(model); // リストモデルは通常スクロールペインを使います。 ScrollPane sp = new ScrollPane(); sp.add(list); add(sp); } public static void main(String[] args) { new JListSample("JListを使ってみよう"); } }
https://w.atwiki.jp/secondlife-b/pages/94.html
{{Biobox new | name = Sayaka Minami | photo =Image Sayaka Minami.jpg|240px | alias = | real name = | birth month = December | birth day = 17 | birth year = 1986 | birth ref = ref Infobox data from {{cite web |url=http //roseopro.co.jp/talent/minami/talent-minami.html|title=南沙也香 (Sayaka Minami - Talents model date)|accessdate=January 1, 2009|publisher=[http //roseopro.co.jp/ roseopro.co.jp]|language=Japanese|google=ja}} /ref | birth location = Yamagata Prefecture, Japan | birth name = | death month = | death day = | death year = | death ref = | death location = | years active = | ethnicity = Asian | ethnicity2 = | nationality = Japanese | nationality2 = | measurements =101-60-90(cm) br 40-24-35(in) | bra/cup size = {{bra|H metric}} | natural tits = Yes | natural tits ref = | implant type = | pierced nipples = | height = {{height|m=161}} | weight = {{weight|kg=}} | body type = | eye color = | hair color = | hair color2 = | hair length = | hair shape = | underarm hair = | pubic hair = | blood = A | topless =Yes | bush = | frontal = | pink = | solo = | solodildo = | solofisting = | lesbian = | lesbiandildo = | lesbianfisting = | blowjob = | hardcore = | anal = | dp = | fisting = | bondage = | watersports = | fistingmen = | homepage = | blog = | livejournal = | myspace = | youtube = | xpeeps = | modelmayhem = | onemodelplace = | deviantart = | flickr = | imdb = | iafd = | afdb = | egafd = | bgafd = }} Sayaka Minami ([http //ja.wikipedia.org/wiki/南沙也香 南沙也香] - Minami Sayaka ) is a Japanese AV idol. She was born on December 17, 1986 in Yamagata Prefecture, Japan. Her bust measurement is 101cm and she wears a metric H cup bra. She considers herself a good cook. ref {{cite web |url=http //roseopro.co.jp/talent/minami/talent-minami.html|title=南沙也香 (Sayaka Minami - Talents model date)|accessdate=January 1, 2009|publisher=[http //roseopro.co.jp/ roseopro.co.jp]|language=Japanese|google=ja}} /ref ==Partial filmography== {{filmography start|style=listfull}} {{film|YSN-037|style=listfull}} {{film|BND-015|style=listfull}} {{filmography end}} ==Bibliography== {{cite web |url=http //actress.dmm.co.jp/-/detail/=/actress_id=23514/|title=南沙也香 (Actress information)|accessdate=January 1, 2009|publisher=[http //www.dmm.co.jp/top/ www.dmm.co.jp]|language=Japanese|google=ja}} {{cite web |url=http //www.av-channel.com/ppv/actress/actress_id=5774|title=南沙也香 (Actress profile)|accessdate=January 1, 2009|publisher=[http //www.av-channel.com/ www.av-channel.com]|language=Japanese|google=ja}} {{cite web |url=http //jans-web.com/profiles/n3450|title=南沙也香 (Sayaka Minami - profile)|accessdate=January 1, 2009|publisher=[http //jans-web.com/ Urabon Navigator]}} {{cite web |url=http //avidol.xcity.jp/english/info.html?AID=1537|title=南沙也香 (Sayaka Minami - profile)|accessdate=January 1, 2009|publisher=[http //avidol.xcity.jp/ XCity]}} ==External links== [http //www.amazon.co.jp/s/ref=nb_ss_gw?__mk_ja_JP=%83J%83%5E%83J%83i url=search-alias%3Daps field-keywords=%93%EC%8D%B9%96%E7%8D%81 x=0 y=0 tag=boobpedia-22 南沙也香 (Sayaka Minami)] at Amazon Japan {{clearboth}} ==References== {{reflist}} Category Adult models Category BOING series models Category Non -No Name- models Category Porn stars Category Wake Ari Kyonyuu series models
https://w.atwiki.jp/mieki256/pages/31.html
#!/usr/bin/env python # -*- coding utf-8 -*- u""" PyGame + OpenGLのテストサンプル - Pキー 平行投影/透視投影の切り替え - Wキー ワイヤーフレーム/ソリッド表示の切り替え - Lキー 照明のon/off - Tキー テクスチャ設定の切り替え(3種類) - Sキー ポイントスプライトの切り替え - Fキー ウインドウ/フルスクリーン切り替え - カーソルキー ティーポットの回転 - Bキー Pause - ESCキー,Qキー 終了 - マウスカーソルの位置に合わせて図形の表示位置を変える。 参考ページ pygameに移行 — メモ庫 v1.0 documentation http //gunload.web.fc2.com/opengl/tutorial/skinning/pygame/ PyOpenGL + PIL でテクスチャ貼り - 銀月の符号 http //d.hatena.ne.jp/fgshun/20080922/1222095288 Wiki - pygame - python game development http //www.pygame.org/wiki/SimpleOpenGL2dClasses """ import pygame from OpenGL.GL import * from OpenGL.GLU import * from OpenGL.GLUT import * from OpenGL.extensions import alternate from OpenGL.GL.ARB.point_parameters import * from OpenGL.GL.EXT.point_parameters import * import Image import math # 照明 light_ambient = [1.0, 1.0, 1.0, 1.0] # 環境光(白色) light_diffuse = [1.0, 1.0, 1.0, 1.0] # 拡散光(白色) light_specular = [1.0, 1.0, 1.0, 1.0] # 鏡面光(白色) light_position = [2.0, 2.0, 1.0, 1.0] # 照明の位置 # マテリアル no_mat = [0.0, 0.0, 0.0, 1.0] # 反射しない mat_ambient = [0.0, 0.0, 0.3, 1.0] # 環境光の青成分だけ少し反射 mat_diffuse = [0.0, 1.0, 0.0, 1.0] # 拡散光の緑成分を全反射 mat_specular = [1.0, 1.0, 1.0, 1.0] # 鏡面光の全成分を全反射 mat_emission = [0.3, 0.3, 0.2, 0.0] # 放射の色 no_shininess = [0.0] # 鏡面反射しない low_shininess = [5.0] # 弱い鏡面反射 high_shininess = [100.0] # 強い鏡面反射 glPointParameterf = alternate( glPointParameterf, glPointParameterfARB, glPointParameterfEXT ) glPointParameterfv = alternate( glPointParameterfv, glPointParameterfvARB, glPointParameterfEXT ) RESET_ATTENUATION = [1.0, 1.0, 1.0] class PyGame def __init__(self) """コンストラクタ""" self._running = True self._screen = None self.frame = 0 # フレームカウンタ self.mx = 0 self.my = 0 self.tex = [] self.cap = "" self.pausefg = False # キー操作で変更するフラグ群 self.flag2d = True # 平行/透視投影 self.wireframe = False # ワイヤーフレーム/ソリッド表示 self.light_enable = True # 照明 on/off self.tex_mode = 0 # テクスチャモード self.point_spr = False # ポイントスプライト on/ff self.fullscr = False # フルスクリーン/ウインドウ表示 self.filter_type = 0 # テクスチャのフィルタ種類(0 or 1) self.tex_repeat = False # テクスチャをリピートさせるか否か self.line_width = 1.0 # ワイヤーフレーム表示時の線の太さ # 画面の縦横幅記録用 self.view_wh = 1.0 self.view_hh = 1.0 # テクスチャ付きポリゴンの色指定用 self.texcol = 0.0 self.texcol_spd = 0.01 self.angle = 0.0 # 回転角度 self.scale = 0.0 # 拡大縮小 self.xrot = 0.0 # 回転角度 self.yrot = 0.0 self.xspeed = 0.0 # 回転速度 self.yspeed = 0.0 self.mvfrm = 0 # eventの分岐をディクショナリに変更 self._eventMap = { pygame.QUIT self.onQuit, pygame.MOUSEBUTTONDOWN self.onMouseDown, pygame.MOUSEBUTTONUP self.onMouseUp, pygame.MOUSEMOTION self.onMouseMotion, pygame.KEYDOWN self.onKeyDown, pygame.KEYUP self.onKeyUp, } def initialize(self, w, h) """初期化処理""" pygame.init() # PyGame初期化 self.scrw = float(w) self.scrh = float(h) return self.init_gl() def init_gl(self) """OpenGL関係の初期化""" w = int(self.scrw) h = int(self.scrh) # OPENGL向けに初期化する modev = pygame.OPENGL | pygame.DOUBLEBUF if self.fullscr modev |= pygame.FULLSCREEN self._screen = pygame.display.set_mode((w, h), modev) if not self._screen return False glViewport(0, 0, int(self.scrw), int(self.scrh)) glClearColor(0.0, 0.0, 0.5, 1.0) # クリア色の設定 # 隠面消去、カリングを設定 glEnable(GL_DEPTH_TEST) glEnable(GL_CULL_FACE) glCullFace(GL_BACK) # 裏面をカリング # 照明の設定 glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient) glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse) glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular) glLightfv(GL_LIGHT0, GL_POSITION, light_position) glEnable(GL_LIGHTING) # 照明を有効化 glEnable(GL_LIGHT0) # 0番目の照明を有効化 # テクスチャの読み込み glEnable(GL_TEXTURE_2D) # テクスチャ有効化 t = self.loadImage( res/tex1.png ) self.tex.append(t[0]) t = self.loadImage( res/tex2.png ) self.tex.append(t[0]) t = self.loadImage( res/tex4.png ) self.tex.append(t[0]) # ウインドウ内の座標値を計算して記録 # (-w ~ 0.0 ~ +w, +h ~ 0.0 ~ -h) s = 8.0 self.view_wh = s * (self.scrw / self.scrh) self.view_hh = s if self.flag2d self.set_view2d() else self.set_view3d() return True def loadImage(self, image_fila_path) """テクスチャ画像をロード""" # PyGameを使って画像ロード textureSurface = pygame.image.load(image_fila_path) # 画像読み込み width = textureSurface.get_width() # 横幅取得 height = textureSurface.get_height() # 縦幅取得 # OpenGLに渡すために文字列化 textureData = pygame.image.tostring(textureSurface, "RGBA", False) texture = glGenTextures(1) # テクスチャを1枚生成 glBindTexture(GL_TEXTURE_2D, texture) # テクスチャとして登録 # _S は横方向、_T は縦方向 # テクスチャをリピートさせるかしないか if self.tex_repeat glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT) glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT) else glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP) glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP) # _MAG_FILTER は拡大時のフィルタ種類, _MIN_ は縮小? if self.filter_type == 0 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST) glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST) else glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR) # glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL) # glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE) glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE) # ポイントスプライトにも使えるように設定 glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE) # テクスチャを設定 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, textureData) # アルファテストの判別関数 # コレを入れないとポイントスプライトを透過できない glAlphaFunc(GL_GREATER, 0.5) return texture, width, height def set_view2d(self) """2D描画用に設定""" # 座標系の設定 glMatrixMode(GL_PROJECTION) # 射影変換 glLoadIdentity() # 単位行列 # 以後、平行投影で描画するよう指定 glOrtho(-self.view_wh, self.view_wh, - self.view_hh, self.view_hh, 0.1, 100.0) # 以下のように書けば、2Dっぽい座標系になる # gluOrtho2D(0, 640, 480, 0) def set_view3d(self) """3D描画用に設定""" glMatrixMode(GL_PROJECTION) glLoadIdentity() # 以後、透視投影で描画するよう指定 gluPerspective(60.0, self.scrw / self.scrh, 0.1, 100.0) def set_tex_mode(self) """テクスチャモードの切り替え""" md = [ GL_REPLACE, GL_MODULATE, GL_DECAL ] glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, md[self.tex_mode]) def update(self) """毎フレーム呼ばれる処理""" if not self.pausefg # マウス座標を表示系の座標値に変換して記録 wh = self.scrw / 2.0 hh = self.scrh / 2.0 self.tx = (self.mx - wh) / wh self.ty = (self.scrh - self.my - hh) / hh self.tx *= self.view_wh self.ty *= self.view_hh self.angle += 1.5 # 角度を更新 self.scale = 2.0 * math.cos(math.radians(self.mvfrm)) + 2.5 self.xrot += self.xspeed self.yrot += self.yspeed # オブジェクトの色指定用変数を変更 self.texcol += self.texcol_spd if self.texcol = 1.0 or self.texcol = 0.0 self.texcol_spd *= -1 self.mvfrm += 1 def draw(self) """描画処理""" # OpenGLバッファのクリア glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) # 視野変換:カメラの位置と方向のセット # gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0) # glShadeModel(GL_FLAT) # フラットシェーディングを有効化 glShadeModel(GL_SMOOTH) # スムースシェーディングを有効化 glEnable(GL_NORMALIZE) # 法線の自動正規化を有効化 # 平行投影/透視投影を設定 if self.flag2d self.set_view2d() else self.set_view3d() # 照明の有効/無効化 if self.light_enable glEnable(GL_LIGHTING) else glDisable(GL_LIGHTING) glMatrixMode(GL_MODELVIEW) glLoadIdentity() self.draw_teapot() # ティーポットを描画 self.draw_ball() # 球を描画 self.draw_cube() # 箱を描画 glDisable(GL_LIGHTING) # 照明無効化 self.draw_point(-self.angle / 4.0, self.view_hh * 0.5) # 点を描画 x = self.tx y = self.ty w = self.view_wh h = self.view_hh # テクスチャ付きポリゴンを描画(テクスチャ1) tx = 0.0 ty = 0.0 tz = -60.0 texid = 0 self.draw_polygon_tex(tx, ty, tz, 1.0, 1.0, h, h, texid) # テクスチャ付きポリゴンを描画(テクスチャ2) tx = self.view_wh / 3 tz = -40.0 texid = 1 self.draw_polygon_tex(tx, ty, tz, 1.0, 1.0, h, h, texid) self.set_view2d() # 平行投影にするよう設定 glDisable(GL_DEPTH_TEST) # 隠面消去を無効 glDisable(GL_CULL_FACE) # カリング無効化 glClear(GL_DEPTH_BUFFER_BIT) # デプスバッファクリア glMatrixMode(GL_MODELVIEW) glLoadIdentity() self.draw_box(x, y, w, h) # 赤いグラデの四角形を描画 self.draw_tri(x, y, w, h) # 緑のグラデの三角形を描画 self.draw_line(x, y, w, h) # 線を描画 # テキストを描画 self.draw_info() # バッファ切り替え (ダブルバッファ時) # glutSwapBuffers() # OpenGL描画実行 (シングルバッファ時?) # glFlush() # pygameダブルバッファ交換 pygame.display.flip() def draw_text(self, x, y, st) """文字列をビットマップフォントで描画""" glColor3f(1.0, 1.0, 1.0) glRasterPos3f(x, y, -3.0) for s in st glutBitmapCharacter(GLUT_BITMAP_HELVETICA_10, ord(s)) def draw_info(self) """現在の状態をテキスト描画する""" lyadd = -(self.view_hh / 12.0) lx = -(self.view_wh * 0.95) ly = self.view_hh + lyadd strlist = [] strlist.append(self.cap) strlist.append("P " + ("Pers" if not self.flag2d else "Ortho")) strlist.append("W " + ("Wireframe" if self.wireframe else "Solid")) strlist.append("L Light " + ("On" if self.light_enable else "Off")) strlist.append("T " + (["GL_REPLACE", "GL_MODULATE", "GL_DECAL"][self.tex_mode])) strlist.append("S PointSprite " + ("On" if self.point_spr else "Off")) strlist.append("F " + ("Full" if self.fullscr else "Wdw")) strlist.append("B Pause") strlist.append("ESC,Q EXIT") for s in strlist self.draw_text(lx, ly, s) ly += lyadd def draw_polygon_tex(self, x, y, z, tx, ty, vx, vy, texid) """テクスチャ付きポリゴンを描画""" col = self.texcol glFrontFace(GL_CCW) # 頂点反時計回りを表として扱う # 頂点配列を作成 vertices = [-1.0, -1.0, 0.0, # 左下 1.0, -1.0, 0.0, # 右下 1.0, 1.0, -25.0, # 右上 - 1.0, 1.0, -25.0 # 左上 ] # テクスチャ座標配列を作成 texcoords = [0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0 ] # カラー配列を作成 colors = [col, col, 0.5, 1.0, col, col, 0.5, 1.0, col, col, 0.0, 1.0, col, col, 0.0, 1.0 ] # 使うテクスチャを選択 glBindTexture(GL_TEXTURE_2D, self.tex[texid]) # テクスチャを透過にする glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glLoadIdentity() glTranslatef(x, y, z) # 平行移動 glRotatef(self.angle / 2.0, 0.0, 0.0, 1.0) # 回転 glScale(vx, vy, 1.0) # 拡大縮小 # 頂点配列、テクスチャ座標配列、カラー配列有効化 glEnableClientState(GL_VERTEX_ARRAY) glEnableClientState(GL_TEXTURE_COORD_ARRAY) glEnableClientState(GL_COLOR_ARRAY) # 頂点配列、テクスチャ座標配列、カラー配列を指定 glVertexPointer(3, GL_FLOAT, 0, vertices) glTexCoordPointer(2, GL_FLOAT, 0, texcoords) glColorPointer(4, GL_FLOAT, 0, colors) glEnable(GL_TEXTURE_2D) # テクスチャを有効に # ポリゴンとして描画 glDrawElements(GL_QUADS, 4, GL_UNSIGNED_BYTE, [0, 1, 2, 3]) # glDrawArrays(GL_POLYGON, 0, 4) glDisable(GL_TEXTURE_2D) # テクスチャを無効に # 頂点配列、テクスチャ座標配列、カラー配列無効化 glDisableClientState(GL_VERTEX_ARRAY) glDisableClientState(GL_TEXTURE_COORD_ARRAY) glDisableClientState(GL_COLOR_ARRAY) def draw_box(self, x, y, w, h) """赤いグラデの四角形を描く""" glFrontFace(GL_CCW) # 頂点反時計回りを表とする h /= 10.0 w = h z = -40.0 glLoadIdentity() glBegin(GL_QUADS) # 描画開始 glColor3f(0.5, 0.0, 0.0) # 色を指定 glVertex3f(x - w, y - h, z) # 左下 glColor3f(0.5, 0.0, 0.0) glVertex3f(x + w, y - h, z) # 右下 glColor3f(1.0, 0.0, 0.0) glVertex3f(x + w, y + h, z) # 右上 glColor3f(1.0, 0.0, 0.0) glVertex3f(x - w, y + h, z) # 左上 glEnd() # 描画終了 def draw_tri(self, x, y, w, h) """緑のグラデの三角形を描く""" glFrontFace(GL_CCW) # 頂点反時計回りを表とする z = -50.0 glBegin(GL_TRIANGLES) # 三角形描画開始 glColor4f(0.0, 1.0, 0.0, 1.0) # 色を指定 glVertex3f(-w, -h, z) # 左下 glVertex3f(w, -h, z) # 右下 glColor4f(0.0, 0.2, 0.0, 0.2) glVertex3f(x, y, z) # 上 glEnd() def draw_line(self, x, y, w, h) """線を描く""" z = -5.0 glColor3f(0.0, 1.0, 1.0) # 水色 glLineWidth(self.line_width) # 線のサイズ glBegin(GL_LINES) glVertex3f(-w, y, z) # 始点 glVertex3f(w, y, z) # 終点 glVertex3f(x, h, z) # 始点 glVertex3f(x, -h, z) # 終点 glEnd() def draw_point(self, startang, r) """点を描く""" glLoadIdentity() z_d = 10 zadd = (float(self.mvfrm) / 5.0) % float(z_d) # アルファブレンディングを有効化 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) glEnable(GL_BLEND) if self.point_spr # ポイントスプライト有効時 glEnable(GL_POINT_SPRITE) # ポイントスプライトを有効化 glDisable(GL_POINT_SMOOTH) # 点のAAを無効化 glEnable(GL_TEXTURE_2D) # テクスチャを有効化 # テクスチャに色指定を反映させるよう指定 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE) # 使うテクスチャを選択 glBindTexture(GL_TEXTURE_2D, self.tex[2]) glEnable(GL_ALPHA_TEST) # アルファテストを有効化 glPointSize(64.0) # 点のサイズを指定 # 距離に応じて点の大きさを変える glPointParameterfv(GL_POINT_DISTANCE_ATTENUATION, [0.0, 0.0, 0.02]) glBegin(GL_POINTS) # 点の描画開始を指定 lang = math.radians(startang) langadd = math.radians(20) for z in range(-40, -5, z_d) # 奥行を変えて描画 zz = z + zadd v = (30.0 + zz + 10.0) / 30.0 if v 1.0 v = 1.0 for i in range(0, 360, 20) # 円を描くように描画 x = r * math.cos(lang) y = r * math.sin(lang) glColor3f(v, v, 0.5) # 色を指定 glVertex3f(x, y, zz) # 点座標を指定 lang += langadd glEnd() # 距離に応じて点のサイズを変えるソレに初期値を入れてリセット glPointParameterfv(GL_POINT_DISTANCE_ATTENUATION, [1.0, 0.0, 0.0]) glDisable(GL_ALPHA_TEST) # アルファテストを無効化 glDisable(GL_POINT_SPRITE) # ポイントスプライトを無効化 self.set_tex_mode() else # ポイントスプライト無効時 glDisable(GL_TEXTURE_2D) # テクスチャを無効化 glDisable(GL_POINT_SPRITE) # point_sprite を無効化 glEnable(GL_POINT_SMOOTH) # 点のAAを有効化 glHint(GL_POINT_SMOOTH_HINT, GL_NICEST) # AAの品質を参考に glPointSize(3.0) # 点のサイズ # 距離に応じて点の大きさを変えない glPointParameterfv(GL_POINT_DISTANCE_ATTENUATION, [1.0, 0.0, 0.0]) glBegin(GL_POINTS) lang = math.radians(startang) langadd = math.radians(10) for z in range(-40, -5, z_d) # 奥行を変えて描画 zz = z + zadd v = (30.0 + zz + 10.0) / 30.0 if v 1.0 v = 1.0 for i in range(0, 360, 10) # 円を描くように描画 x = r * math.cos(lang) y = r * math.sin(lang) glColor3f(v, v, 0.5) # 色を指定 glVertex3f(x, y, zz) # 点座標を指定 lang += langadd glEnd() glDisable(GL_TEXTURE_2D) # テクスチャを無効化 def set_material(self, kind) """マテリアルを設定""" matdata = [ [mat_ambient, mat_diffuse, no_mat, no_shininess, no_mat], [no_mat, mat_diffuse, mat_specular, low_shininess, no_mat], [no_mat, mat_diffuse, mat_specular, high_shininess, no_mat], [no_mat, mat_diffuse, no_mat, no_shininess, mat_emission] ] dt = matdata[kind] glMaterialfv(GL_FRONT, GL_AMBIENT, dt[0]) glMaterialfv(GL_FRONT, GL_DIFFUSE, dt[1]) glMaterialfv(GL_FRONT, GL_SPECULAR, dt[2]) glMaterialfv(GL_FRONT, GL_SHININESS, dt[3]) glMaterialfv(GL_FRONT, GL_EMISSION, dt[4]) def draw_teapot(self) """ティーポットを描く""" glFrontFace(GL_CW) # teapotは頂点時計回りが表。他と逆なので注意。 glEnable(GL_DEPTH_TEST) # 隠面消去を有効化 glDisable(GL_CULL_FACE) # カリング無効化 # teapotだけはテクスチャを反映できるので、テクスチャを無効にしておく。 # cubeやsphere等はテクスチャを反映できない。 glDisable(GL_TEXTURE_2D) self.set_material(1) # マテリアルの設定 # 平行移動、回転、拡大縮小は、 # 下に書いてある変換のほうから先に実行される glLoadIdentity() glTranslatef(-6.0, 0.0, -10.0) # 平行移動 glRotatef(self.xrot, 1.0, 0.0, 0.0) # x軸に沿って回転 glRotatef(self.yrot, 0.0, 1.0, 0.0) # y軸に沿って回転 glScale(1.0, 1.0, 1.0) # 拡大縮小 glColor3f(1.0, 0.0, 0.0) # 色を赤に(照明利用時は無視される) if self.wireframe # ワイヤーフレームで描画 glLineWidth(self.line_width) # 線のサイズ glutWireTeapot(2.0) else # ソリッドで描画 glutSolidTeapot(2.0) def draw_cube(self) """立方体を描画""" glFrontFace(GL_CCW) # cubeは頂点反時計回りが表扱い glEnable(GL_CULL_FACE) # カリング有効化 glCullFace(GL_BACK) # 裏面をカリングするように指定 self.set_material(0) # マテリアルの設定 glLoadIdentity() glTranslatef(0.0, 0.0, -15.0) glRotatef(self.angle, 0.0, 1.0, 1.0) # y軸、z軸に沿って回転 glScale(1.0, 1.0, self.scale / 2) glColor3f(0.0, 1.0, 0.0) # 色を緑に if self.wireframe glLineWidth(self.line_width) glutWireCube(3.0) else glutSolidCube(3.0) def draw_ball(self) """球を描画""" glFrontFace(GL_CCW) # 球は頂点反時計回りが表扱い glEnable(GL_CULL_FACE) glCullFace(GL_BACK) self.set_material(2) # マテリアルの設定 glLoadIdentity() glTranslatef(6.0, 0.0, -20.0) glRotatef(self.angle, 1.0, 0.0, 0.0) # x軸に沿って回転 glScale(1.0, self.scale, 1.0) glColor3f(1.0, 0.0, 1.0) # 色を紫に if self.wireframe glLineWidth(self.line_width) glutWireSphere(1.0, 10, 10) else glutSolidSphere(1.0, 10, 10) def on_event(self, event) """イベント発生時に呼ばれる処理""" if event.type in self._eventMap self._eventMap[event.type](event) def onQuit(self, event) """メインループを終了させるよう設定""" self._running = False def onKeyDown(self, event) """キーが押された瞬間に呼ばれる処理""" if event.key == pygame.K_ESCAPE or event.unicode == u q # ESCキーかqキーが押されたので終了 pygame.event.post(pygame.event.Event(pygame.QUIT)) elif event.key == pygame.K_UP # 上キーが押された self.xspeed -= 0.1 elif event.key == pygame.K_DOWN # 下キーが押された self.xspeed += 0.1 elif event.key == pygame.K_LEFT # 左キーが押された self.yspeed -= 0.1 elif event.key == pygame.K_RIGHT # 右キーが押された self.yspeed += 0.1 elif event.key == pygame.K_l # 照明のon/off self.light_enable = not self.light_enable elif event.key == pygame.K_p # 平行投影/透視投影の切り替え self.flag2d = not self.flag2d elif event.key == pygame.K_w # ワイヤーフレーム/ソリッド描画の切り替え self.wireframe = not self.wireframe elif event.key == pygame.K_t # テクスチャモードの切り替え self.tex_mode = (self.tex_mode + 1) % 3 md = [GL_REPLACE, GL_MODULATE, GL_DECAL] glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, md[self.tex_mode]) elif event.key == pygame.K_f # フルスクリーン/ウインドウの切り替え self.fullscr = not self.fullscr self.init_gl() elif event.key == pygame.K_s # ポイントスプライトの切り替え self.point_spr = not self.point_spr elif event.key == pygame.K_b # ポーズ self.pausefg = not self.pausefg else print("KeyDown", event.unicode, event.key, event.mod) def onKeyUp(self, event) """キーが離された瞬間に呼ばれる処理""" # print("KeyUp", event.key, event.mod) pass def onMouseDown(self, event) """マウスボタンが押された瞬間に呼ばれる処理""" lis = [ unknown , # 0 left , # 1 middle , # 2 right , # 3 wheelup , # 4 wheeldown # 5 ] if event.button = 5 print( onMouseDown , lis[event.button], event.pos) def onMouseUp(self, event) """マウスボタンが離された瞬間に呼ばれる処理""" lis = [ unknown , # 0 left , # 1 middle , # 2 right , # 3 wheelup , # 4 wheeldown # 5 ] if event.button = 5 print( onMouseUp , lis[event.button], event.pos) def onMouseMotion(self, event) """マウスカーソルが動いた時に呼ばれる処理""" # print( onMouseMotion , event.pos, event.rel, event.buttons) self.mx = event.pos[0] self.my = event.pos[1] def execute(self, w, h) if not self.initialize(w, h) return timer = pygame.time.Clock() # メインループ while self._running timer.tick(60) # 60FPSを指定 for event in pygame.event.get() self.on_event(event) self.update() self.draw() self.frame += 1 self.cap = %5.2f FPS % (timer.get_fps()) # ウインドウタイトル文字列を指定 pygame.display.set_caption(self.cap) pygame.quit() if __name__ == "__main__" game = PyGame() game.execute(800, 600)
https://w.atwiki.jp/terragen/pages/216.html
Node Type Render ノード説明と目的 注意) 『Render Pixel Sampler』は、適応ピクセルサンプラーのパラメータを含むノードで、『Render』ノードの内部ネットワークに含まれています。『Render Pixel Sampler』ノードをしても問題はありませんが、デフォルト設定で次回に画像をレンダリングするか、または[Edit Sampling...]ボタンを押す事で新たなノードを作成する事も出来ます。ただし、『Render Pixel Sampler』ノードを追加作成しないで下さい。予期しない動作が発生する可能性があります。 設定 Anti-aliasing アンチエイリアス "Ray trace objects"、または"Ray trace everything"を使用する場合、画像のクオリティはこのパラメータに大きく依存します。実際、このパラメータは、適応ピクセルサンプラのパラメータをコントロールするするプリセットのようなものです。通常は自動で適切なプリセットが選ばれていますが、より精密なコントロールを望む場合は、この数値を編集する事で可能になります。 Max samples per pixel ピクセルあたりの最大サンプラー "First sampling level"を "Max samples (non-adaptive)"に設定しない限り、"Pixel noise threshold"が適応サンプリング(=適応アンチエイリアシング)に使用されます。例えば、"Anti-aliasing"が4に設定されている場会、"Max samples per pixel"を16、"First sampling level"を"1/16 first samples"に設定します。これにより、最大サンプル数が16の場合、1ピクセルあたり1サンプルの最小値が得られます。"Min samples per pixel"は、"Max samples per pixel"と"First sampling level"のポップアップからの選択に依存します。また、アンチエイリアスは奇特な間隔で処理するため各ピクセルについて必ずしも同じではない可能性があるため、値の隣に"mean(平均)"と表示されます。上記の例では、まずTerragenはピクセルごとに1つのサンプルを取ります。4ピクセルごとに、それらのピクセルの輝度とピクセルの平均輝度の違いを検分します。これは、このエリアにどれだけのノイズやコントラストがあるかを推定する方法です。総差が"Pixel noise threshold"の設定値よりも大きい場合、そのピクセルは4つのサブピクセルに細分化されます。このプロセスは、サブピクセルに続き、一度に4つのサンプルのセットを比較してさらに細分化するかを決定します。次のレベルに細分化するかを決定するために使用される実際のしきい値は、ピクセルのサイズと比較した現在の細分レベルにおけるサンプル間の間隔に依存します。より細かな細分化レベル(より多くのサンプル)では、サンプルのそれぞれがピクセル結果への寄与が少ないため、許容できるしきい値をより高く(細分する可能性は低い)する事で、出来る限り早く細分化を中止する手助けをします。同様に、"First sampling level"が1ピクセルあたり1よりも粗い場合、"First sampling level"で使用される実際のしきい値は入力された値よりも低くなります。"Min samples per pixel"が1未満である事を示す設定を選択した場合、これは"First sampling level"の間の間隔が1ピクセルより大きくなる事を意味します。"Anti-aliasing"が1で、"First sampling level"が"1/4 first samples"の時、これは4ピクセル(2ピクセル間隔)ごとに"First sampling level"が存在する事を意味します。同様に"Anti-aliasing"が2で、"First sampling level"が"1/16 first samples"にも当てはまります。"First sampling level"をこれより粗くする事も出来ます。通常、低クオリティのプレビューに役立つだけですが見た目に悪くなく高速です。アンチエイリアスレベルが2の累乗である場合、すべてが理にかないます。これは1,4,16,64の最大サンプルに対応します。適応プロセスの全レベルでのサンプル間の間隔は2の累乗になります。ただし、Terragenのアンチエイリアスレベルでは、奇数値を使用すると、"First sampling level"のサンプルが正確なピクセル間隔にならない事があります。そのため、ピクセルあたりの平均最小サンプル数が非整数になる事があります。現在のところ、適応サンプラーは個々のRGBコンポーネントではなく、輝度から調整しています。異なる色相、彩度値を有しますが、同じ"luminance(輝度)"を与えるサンプルは等しいと見なされるので、色および彩度の高い量のノイズがサンプラにより許容する事が出来ます。これは、人間の視覚がこれらの高周波数の変化にあまり敏感でないため、多くの場合許容されます。また、輝度計算では、これらの値の加重値によって、青色チャネルで最もノイズが多く、緑色チャネルで最もノイズが少ない事も意味します。しかし、この近似が十分でない状況が多いので、将来のバージョンでこれを変更するオプションを追加します。 Min samples per pixel ピクセルあたりの最小サンプラー Customise sampling サンプリングのカスタマイズ First sampling level 最初のサンプリングレベル Pixel noise threshold ピクセルノイズのしきい値 Legacy adaptive sampler 旧来のアダプティブサンプラー 設定した値に応じて、ノイズの発生しやすい場所でのサンプリングが増加します。多くの場合レンダリング時間とクオリティのバランスが優れているため多くの用途に適応します。ただし、この旧式のアダプティブサンプラーは、特に暗いサーフェスで、パストレースによって作成されたモンテカルロノイズの一部を処理するのに問題があります。 New curve 新しいカーブ これを有効にすると、隣接するサンプルとのコントラストのために適応サンプラーがRGB値をどのように推定するかを変更します。主な違いは、"New curve"が明るいピクセル(特に超明るいピクセル)のノイズ耐性を高め、影や中間範囲に費やす時間が長くなる事です。有効時はレンダリング時間が通常より短くなります。これにより、より高いアンチエイリアシングを使用して、より短時間でより高品質の画像を得る事が出来ます。 Robust adaptive sampler ロバストアダプティブサンプラー これを有効にすると、適応サンプラーは、画像品質を向上させるために、より堅牢な取り組みを使用してノイズを推定します。そのため、スーパーサンプリングのために考慮されている現在のピクセルまたはサブピクセルを囲むサンプルのより大きなグリッドを調査します。これは、DOF(被写界深度)、3Dモーションブラー、パストレース、まばらな小さなオブジェクトからのノイズが多いシーンをレンダリングする場合に重要です。アニメーションの一時的なエイリアシングを減らすのに役立ちます。古い適応サンプラーでは見逃されがちなサンプルが含まれているため、繊細な植物の品質を高める事が出来ます。有効時はシーンに依存するため、レンダリング時間が以前より短くなったり長くなったりする事があります。画像の一部は以前よりもノイズが目立つように見える事がありますが、他の部分はよりきれいに見える事もあるので、アンチエイリアスやピクセルノイズのしきい値を調整して、要求する結果を得るためのコントロールをして下さい。これの有効時は、上記の"New curve"が自動的に使用されます。